/*
 * 表格实例
 */
var TABLE = (TABLE == undefined) ? null : TABLE;

/*
 * 表格类型
 */
var TABLE_TYPE = (TABLE_TYPE == undefined) ? "DATA" : TABLE_TYPE;

/*
 * 权限开关
 */
var RIGHTS = (RIGHTS == undefined) ? {NONAME: null} : RIGHTS;

/*
 * 模块操作路径
 */
var MODULE_PATH = (MODULE_PATH == undefined) ? "#CTX()/admin/" : MODULE_PATH;

/*
 * 默认弹窗大小
 */
var POPUP_AREA = (POPUP_AREA == undefined) ? ['720px', '95%'] : POPUP_AREA;

/*
 * 数据表的OPTIONS
 */
// 基础OPTIONS
var BASE_OPTIONS = {
    elem: '#data-table', // 数据表格的默认ID
    toolbar: '#table-toolbar', // 头部工具栏
    url: MODULE_PATH + "query", // 查询URL
    method: 'post', // 请求的方式
    cellExpandedMode: 'tips', // 单元格默认展开方式
    request: {pageName: 'pageNumber', limitName: 'pageSize' }, // 定义分页请示参数名
    defaultToolbar: [{title: '查询', layEvent: 'toggle', icon: 'layui-icon-search'}, 'filter'], // 头部工具栏右侧图标
    height: 'full-100', // 表格容器高度
    page: true, // 默认开启分页
};
if (TABLE_TYPE == 'TREE') {
    BASE_OPTIONS = Object.assign(BASE_OPTIONS, {
        tree: { // treeTable 组件的特定属性集
            customName: { // 定义属性名的集合
                icon: "customIcon" // 定义图标的属性名称
            }
            ,view: { // 视图相关的属性集合
                dblClickExpand: false // 双击节点时，不展开节点
                ,expandAllDefault: true // 默认展开全部节点
                ,showIcon: true // 显示节点图标
            }
            ,data: { // 数据相关的属性集合
                rootPid: '0' // 设置根节点的 pid 属性值
                ,cascade: 'none' // 设置复选的级联方式
            }
        },
        page: false
    });
}
var OPTIONS = (OPTIONS == undefined) ? BASE_OPTIONS : Object.assign(BASE_OPTIONS, OPTIONS);

(function ($ = layui.jquery) {

    /*
     * 数据表格页面通用脚本，同时也支持树状表格
    */
    layui.use(['table', 'treeTable', 'form', 'jquery', 'common'], () => {
        var $ = layui.jquery, form = layui.form, common = layui.common;

        if (TABLE_TYPE == "TREE") {
            TABLE = layui.treeTable; // 数形表格
        } else {
            TABLE = layui.table; // 数据表格
        }

        // 移动模式下重设弹窗都设为全屏
        if (common.isModile()) {POPUP_AREA = ['100%', '100%'];}


        // ------------------------------- 操作方法定义开始 --------------------------------------------------------------//
        window.dataTable = (window.dataTable == undefined) ? {} : window.dataTable;

        /*
          * 数据表格操作方法
          */
        window.dataTable = {
            /*
             * 重新渲染整个数据表格，并带上查询面板中的查询参数
             */
            search: (obj) => {
                // 从查询表单中获取参数
                OPTIONS.where = form.val("query-form");
                // OPTIONS中的默认排序参数带入到where参数中
                if (OPTIONS.initSort) {
                    OPTIONS.where.sortField = OPTIONS.initSort.field;
                    OPTIONS.where.sortType = OPTIONS.initSort.type;
                }
                // 渲染表格
                TABLE.render(OPTIONS);
            }
            /*
             * 重新加载数据表格数据
             */
            , refresh: (obj) => {
                // 重新加载数据表格
                TABLE.reloadData("data-table", null, true);
            }
            /*
             * 新建记录
             */
            , add: (obj) => {
                var url = MODULE_PATH + "add";
                window.dataTable.addOrEdit("<i class='layui-icon layui-icon-add-1'></i>&nbsp;&nbsp;新增", url, "post", "add");
            }
            /*
             * 新建子项记录
             */
            , addChild: (obj) => {
                var url = MODULE_PATH + "add?parentId=" + obj.data['id'];
                window.dataTable.addOrEdit("<i class='layui-icon layui-icon-add-1'></i>&nbsp;&nbsp;新增", url, "post", "add");
            }
            /*
             * 编辑记录
             */
            , edit: (obj) => {
                var url = MODULE_PATH + "edit?id=" + obj.data['id'];
                window.dataTable.addOrEdit("<i class='layui-icon layui-icon-edit'></i>&nbsp;&nbsp;编辑", url, "put", "edit");
            }
            /*
             * 新增或编辑记录总方法
             */
            , addOrEdit: (title, url, method, action) => {
                layer.open({
                    type: 2,
                    title: title,
                    content: url,
                    area: POPUP_AREA,
                    anim: 6,
                    moveOut: false,
                    resize: false,
                    skin: 'layui-layer-molv',
                    shadeClose: true,
                    btn: [ '保存', '取消' ],
                    yes: (index, layero) => {
                        var iframeWindow = window['layui-layer-iframe' + index],
                        submitID = 'data-save', // 此ID必须和弹出iframe窗口中提交按钮的ID和Filter值一致
                        submit = layero.find('iframe').contents().find("#" + submitID);

                        // 监听提交
                        iframeWindow.layui.form.on('submit('+ submitID + ')', function(data) {
                            $.ajax({ // 用Ajax替换弹窗中的提交
                                url : MODULE_PATH + action,
                                type : method,
                                data : data.field, // 获取提交的数据
                                beforeSend : () => {layer.load();}, // 防止重复操作
                                complete : () => {layer.closeAll('loading');}, //解除防重复操作
                                success : (result) => {
                                    if(result.code == 200){
                                        // 提交 Ajax 成功后，静态更新表格中的数据
                                        window.dataTable.refresh(); // 数据表格刷新
                                        layer.close(index); //关闭弹层
                                    } else {
                                        if(result.description){
                                            // Ajax调用成功，但后台返回失败信息
                                            layer.alert(result.description, {icon: 5});
                                        } else {
                                            layer.alert("操作失败！", {icon: 2});
                                        }
                                    }
                                },
                                error : function (e) { // Ajax调用失败
                                    layer.alert("操作失败：" + e.responseText, {icon: 2});
                                }
                            });
                            return false; // 一定要返回False来阻止弹出窗口中提交按钮的再次提交
                        });

                        submit.trigger('click'); // 这里触发弹出窗口的提交按钮
                    }
                });
            }
            /*
             * 多记录移除
             */
            , batchRemove: (obj) => {
                var checkedIds = common.checkField(obj, 'id');

                if (checkedIds === "") {
                    layer.msg("未选中任何记录", {
                        icon: 3,
                        time: 1000
                    });
                    return false;
                }
                window.dataTable.removeByIds(checkedIds);
            }
            /*
             * 单记录移除
             */
            , remove: (obj) => {
                window.dataTable.removeByIds(obj.data['id']);
            }
            /*
             * 通过ID表移除记录
             */
            , removeByIds: (ids) => {
                layer.confirm('确定要删除选择的记录？', {
                    icon: 3,
                    title: '提示'
                }, (index) => {
                    layer.close(index);
                    $.ajax({
                        url: MODULE_PATH + "delete",
                        dataType: 'json',
                        type: 'delete',
                        data: {"ids": ids},
                        beforeSend: () => {layer.load();}, // 防止重复操作
                        complete: () => {layer.closeAll('loading');}, //解除防重复操作
                        success: (result) => {
                            if (result.code == 200) {
                                // 提交 Ajax 成功后，静态更新表格中的数据
                                window.dataTable.refresh(); // 数据表格刷新
                            } else {
                                if(result.description){
                                    // Ajax调用成功，但后台返回失败信息
                                    layer.alert(result.description, {icon: 5});
                                } else {
                                    layer.alert("操作失败！", {icon: 2});
                                }
                            }
                        }
                    })
                });
            }
            /*
             * 查看记录详情
             */
            , detail: (obj) => {
                layer.open({
                    type : 2,
                    title : "<i class='layui-icon layui-icon-survey'></i>&nbsp;&nbsp;查看",
                    content : MODULE_PATH + "detail?id=" + obj.data['id'],
                    maxmin : false,
                    area : POPUP_AREA,
                    closeBtn : 1,
                    shadeClose : false,
                    anim : 1,
                    moveOut : false,
                    resize : false,
                    btn : [ '关闭' ],
                    yes : (index, layero) => {
                        layer.close(index); // 关闭弹层
                    }
                });
            }
            /*
             * 导入Excel数据
             */
            , importExcel: () => {

            }
            /*
             * 导出成Excel
             */
            , exportExcel: () => {

            }
            /*
             * 清空所有记录
             */
            , clearAll: () => {
                layer.confirm("确认清空所有记录吗？", {
                    icon: 3,
                    title: '确认'
                }, (index) => {
                    layer.close(index);
                    $.ajax({
                        url: MODULE_PATH + "clear",
                        method: "post",
                        data: form.val("query-form"),
                        beforeSend : () => {layer.load();}, // 防止重复操作
                        complete : () => {layer.closeAll('loading');}, //解除防重复操作
                        success: (result) => {
                            if (result.code == 200) {
                                layer.alert("操作成功！", {icon: 1});
                                window.dataTable.search();
                            } else {
                                if(result.description){
                                    // Ajax调用成功，但后台返回失败信息
                                    layer.alert(result.description, {icon: 5});
                                } else {
                                    layer.alert("操作失败！", {icon: 2});
                                }
                            }
                        }
                    });
                });
            }
            , handleEvent: (event, obj) => {}
        };

        /*
         * 树型表格
         */
        if (TABLE_TYPE == "TREE") {
            /*
             * 树型表格继承自数据表格
             */
            window.treeTable = window.dataTable;

            /*
             * 定义展开树型表格方法
             */
            window.dataTable.expandAll = () => {
                TABLE.expandAll('data-table', true);
            };

            /*
             * 定义收缩树型表格方法
             */
            window.dataTable.foldAll = () => {
                TABLE.expandAll('data-table', false);
            };

            /*
             * 重写数据表格的Done方法
             */
            OPTIONS.done = (res, curr, count) => {
                // 展开全部
                //window.treeTable.expandAll();
            };
        }
        // ------------------------------- 操作方法定义结束 --------------------------------------------------------------//


        // ------------------------------- 表格事件监听开始 --------------------------------------------------------------//
        // 监听行双击事件
        TABLE.on('rowDouble(data-table)', (obj) => {
            if (window.dataTable.handleEvent("doubleClick", obj) == true){
                return;
            }
            window.dataTable.detail(obj);
        });

        // 表格上端工具条按钮
        TABLE.on('toolbar(data-table)', (obj) => {
            if (window.dataTable.handleEvent(obj.event, obj) == true){
                return;
            }
            if (obj.event === 'add') {
                window.dataTable.add(obj);
            }
            if (obj.event === 'batchRemove') {
                window.dataTable.batchRemove(obj);
            }
            if (obj.event === 'clearAll') {
                window.dataTable.clearAll(obj);
            }
            if (obj.event === 'expandAll') {
                window.treeTable.expandAll(obj);
            }
            if (obj.event === 'foldAll') {
                window.treeTable.foldAll(obj);
            }
            if (obj.event === 'toggle') {
                window.queryForm.toggle();
            }
        });

        // 监听表格中每条记录后面的操作
        TABLE.on('tool(data-table)', (obj) => {
            if (window.dataTable.handleEvent(obj.event, obj) == true){
                return;
            }
            if (obj.event === 'addChild') {
                window.dataTable.addChild(obj);
            }
            if (obj.event === 'remove') { //
                window.dataTable.remove(obj);
            }
            if (obj.event === 'edit') {
                window.dataTable.edit(obj)
            }
        });

        // 监听表格标题头部排序切换小箭头
        TABLE.on('sort(data-table)', (obj) => {
            // 更新OPTIONS的排序字段
            OPTIONS.initSort = {"field": obj.field, "type": obj.type};
            // 查询数据表格
            window.dataTable.search(obj);
        });

        // ------------------------------- 表格事件监听结束 --------------------------------------------------------------//

    });
})();